Indexed DBにScrapbox APIのcacheを保存する
cacheできるprojectの数が増えるはず
interface
cache戦略
maxAge: cacheの寿命
reload: cacheを無視してnetworkから取得する
flow
cacheがあるとき
cacheの最終更新日時 + maxAgeが現在時刻より前
networkから取ってくる
reloadが指定されてる
networkから取ってくる
otherwise
cacheを返す
cacheがないとき
networkから取ってくる
networkから取ってくるときも、特に更新がなければcacheを更新しない
一旦cacheを返した後に、networkから取ってきたdataを返すようにする?
{result, newValuePending}みたいなのを返す
cacheの更新が完了すると、newValuePendingが解決する
利用側では、まずresultを使って処理を行う
newValuePendingが解決したら、それを使って処理し直す
data structure
https://gyazo.com/dbd01d4d9ec7f51e87f89ec92fde9207
具体的には以下のObject Storeを用意しようと思っているtakker.icon
それぞれ、複数のUserScriptから使うことを想定しているので、ある程度汎用的なデータ構造にしている
Workerで計算するためのデータを作る
毎回計算するのは負荷が高いので、予め計算しておく
Workerは計算済みのデータを直接読み取りに行く
コピーはしない
検索モジュールとある程度密結合にせざるを得なさそう
Pageが更新されるたびに計算し直す
code:ts
type Index = {
workerIndex: number; // keyにする
updated: number;
source: {
id: string;
word: string; // この文字列を検索する
}[];
};
WorkerはIndexのデータを使ってあいまい検索し、検索したidの配列をUI threadに返却する
順序は維持する
補完ソースに応じて、Indexを格納するObject Storeを変える
databaseの管理と、cacheの取得処理を分けるか
cacheとnetworkの切り替え
設計がまだイマイチだな
2つ以上の機能が混ざっている匂いがするtakker.icon
止めよう
密結合にするとろくなことにならない
scriptを超えてデータを共有しなくてもいいんじゃないか
scriptごとに独立してデータを持たせれば、下手に連携のことを考えずにすむ
そもそもscriptを超えて使い回せるデータとかまずないし。